/*
 $License:
    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
    See included License.txt for License information.
 $
 */
/**
 *  @addtogroup  DRIVERS Sensor Driver Layer
 *  @brief       Hardware drivers to communicate with sensors via I2C.
 *
 *  @{
 *      @file       inv_mpu_dmp_motion_driver.h
 *      @brief      DMP image and interface functions.
 *      @details    All functions are preceded by the dmp_ prefix to
 *                  differentiate among MPL and general driver function calls.
 */
#ifndef _INV_MPU_DMP_MOTION_DRIVER_H_
#define _INV_MPU_DMP_MOTION_DRIVER_H_

#define TAP_X               (0x01)
#define TAP_Y               (0x02)
#define TAP_Z               (0x04)
#define TAP_XYZ             (0x07)

#define TAP_X_UP            (0x01)
#define TAP_X_DOWN          (0x02)
#define TAP_Y_UP            (0x03)
#define TAP_Y_DOWN          (0x04)
#define TAP_Z_UP            (0x05)
#define TAP_Z_DOWN          (0x06)

#define ANDROID_ORIENT_PORTRAIT             (0x00)
#define ANDROID_ORIENT_LANDSCAPE            (0x01)
#define ANDROID_ORIENT_REVERSE_PORTRAIT     (0x02)
#define ANDROID_ORIENT_REVERSE_LANDSCAPE    (0x03)

#define DMP_INT_GESTURE     (0x01)
#define DMP_INT_CONTINUOUS  (0x02)

#define DMP_FEATURE_TAP             (0x001)
#define DMP_FEATURE_ANDROID_ORIENT  (0x002)
#define DMP_FEATURE_LP_QUAT         (0x004)
#define DMP_FEATURE_PEDOMETER       (0x008)
#define DMP_FEATURE_6X_LP_QUAT      (0x010)
#define DMP_FEATURE_GYRO_CAL        (0x020)
#define DMP_FEATURE_SEND_RAW_ACCEL  (0x040)
#define DMP_FEATURE_SEND_RAW_GYRO   (0x080)
#define DMP_FEATURE_SEND_CAL_GYRO   (0x100)

#define INV_WXYZ_QUAT       (0x100)

/* Set up functions. */
// 加载MPU传感器的固件
int dmp_load_motion_driver_firmware(void);
//  设置MPU传感器的FIFO缓冲区速率。
int dmp_set_fifo_rate(unsigned short rate);
// 获取MPU传感器的FIFO缓冲区速率。
int dmp_get_fifo_rate(unsigned short *rate);
//  启用MPU传感器的特定功能。
int dmp_enable_feature(unsigned short mask);
//  获取MPU传感器的已启用功能。
int dmp_get_enabled_features(unsigned short *mask);
// 设置MPU传感器的中断模式。
int dmp_set_interrupt_mode(unsigned char mode);
// 设置MPU传感器的方向。
int dmp_set_orientation(unsigned short orient);
//  设置MPU传感器的陀螺仪偏置。
int dmp_set_gyro_bias(long *bias);
// 设置MPU传感器的加速度偏置。
int dmp_set_accel_bias(long *bias);

/* LP quaternion functions. */
//  启用或禁用MPU传感器的低功耗四元数输出。低功耗模式下，传感器会降低功耗，但可能会影响数据的准确性。
int dmp_enable_lp_quat(unsigned char enable);
// 启用或禁用MPU传感器的6轴低功耗四元数输出。6轴模式下，传感器会输出6个轴的数据（加速度和陀螺仪），低功耗模式下，传感器会降低功耗，但可能会影响数据的准确性。
int dmp_enable_6x_lp_quat(unsigned char enable);

/* DMP陀螺仪校准函数 */
// 启用或禁用MPU传感器的陀螺仪校准功能。陀螺仪校准可以提高传感器的精度和稳定性，尤其是在振动或运动条件下。
int dmp_enable_gyro_cal(unsigned char enable);

/**
 *  读取MPU的FIFO缓冲区数据。这个函数应该在MPU的中断被检测到时调用。
 *
 *  @param gyro      陀螺仪数据
 *  @param accel     加速度数据
 *  @param quat      四元数数据
 *  @param timestamp  数据的时间戳
 *  @param sensors   一个位掩码，表示哪些数据类型被包含在FIFO缓冲区中
 *  @param more      一个标志，表示FIFO缓冲区中是否还有更多的数据
 *
 *  @return          0 if successful, otherwise an error code
 */
int dmp_read_fifo(short *gyro, short *accel, long *quat,
    unsigned long *timestamp, short *sensors, unsigned char *more);

#endif

